import axios from "axios"
import qs from "qs"
import { Indicator } from "mint-ui"
import { Toast } from "vant"
import store from "../store/index"
/**
 * 根据环境变量区分接口的默认地址
 */
// switch (process.env.NODE_ENV) {
//   case "production": //生产环境
//     axios.defaults.baseURL = "http://api.com" //这些都是随便写的
//     break
//   case "test": //测试环境
//     axios.defaults.baseURL = "http://127.0.0.1:8080" //这些都是随便写的
//     break
//   default: //默认环境
//     axios.defaults.baseURL = " http://127.0.0.1:3000" //这些都是随便写的
// }

/**
 * 设置超时时间和跨域是否允许携带凭证
 */

//配置跨域的问题
axios.defaults.baseURL = "/api"

axios.defaults.timeout = 15000
axios.defaults.withCredentials = true

/**
 * 设置请求头 传递数据的格式(看服务器要求什么格式,有些是json格式)
 * x-www-form-urlencoded
 * ?xxx=xxx&aaa=aaa
 */
axios.defaults.headers["content-Type"] = "application/x-www-form-urlencoded"
// axios.defaults.headers["content-Type"] = "application/json"
axios.defaults.transformRequest = (data) => qs.stringify(data)

/**
 * 设置请求拦截器
 * 过程:
 * 客户端发送请求 -> 请求拦截器  ->服务器
 * token校验(JWT) 接受服务返回的token,存到vuex/本地存储中,
 * 每一次向服务器发请求,我们应该把token带上
 */

axios.interceptors.request.use(
  (config) => {
    //携带上token
    Indicator.open("加载中...")
    // 执行登录vuex数据的读取
    store.commit("userInit")
    console.log(store.state.user.loginStatus)
    if (store.state.user.loginStatus) {
      config.headers.token = store.state.user.token
      console.log(config.headers.token)
    }
    return config
  },
  (error) => {
    return Promise.reject(error)
  }
)

/**
 * 响应拦截器
 * 过程
 * 服务器返回学习 -> 响应拦截  -> 客户端JS获取到信息
 *
 */

axios.interceptors.response.use(
  (response) => {
    setTimeout(() => {
      Indicator.close()
    }, 500)
    console.log(response.data)
    return response.data
  },
  (error) => {
    // return Promise.reject(error)
    let { response } = error

    if (response) {
      setTimeout(() => {
        Indicator.close()
      }, 500)
      // => 服务器最起码返回结果了
      switch (response.status) {
        case 400:
          Toast("登录过期，重新登录")
        case 401: //权限
          break
        case 403: //服务器拒绝执行(token过去)
          break
        case 404: //找不到页面
          console.log("找不到页面")
          break
        case 405:
          Toast("该账号未注册")
          break
      }
    } else {
      // =>服务器连结果都没有返回 //没有网
      if (!window.navigator.onLine) {
        // 断网处理:可以跳转到断网的页面 router
        Indicator.close()
        this.$router.push("/netdisconnection")
        return
      }
      return Promise.reject(error)
    }
  }
)

export default axios //
